package com.hadoop.hdfs.demo;


import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.util.Arrays;
import java.util.Iterator;
import java.util.Map;

public class HadoopClient {
    private FileSystem fileSystem = null;
    private Configuration configuration =null;

    /**
     * 初始化
     */
    @Before
    public void init() throws IOException {
        configuration = new Configuration();//去加载jar包中的hdfs-default.xml
        configuration.set("fs.defaultFS", "hdfs://192.168.186.148:9000");// 构造一个配置参数对象，设置一个参数：我们要访问的hdfs的URI
        /**
         * 参数优先级： 1、客户端代码中设置的值 2、classpath下的用户自定义配置文件 3、然后是服务器的默认配置
         */
        configuration.set("dfs.repliacation", "3");
        // 获取一个hdfs的访问客户端，根据参数，这个实例应该是DistributedFileSystem的实例
        fileSystem = FileSystem.get(configuration);// 去构造一个访问hdfs文件系统的客户端，以及hdfs的访问地址

        // 如果这样去获取，那conf里面就可以不要配"fs.defaultFS"参数，而且，这个客户端的身份标识已经是hadoop用户
       // fs = FileSystem.get(new URI("hdfs://hdp-node01:9000"), conf, "hadoop");

    }


    /**
     * a上传文件
     *
     * @throws IOException
     */
    @Test
    public void upload() throws IOException {
        // 要上传的文件所在的本地路径
        Path src = new Path("d:/scala-intellij-bin-2017.3.11.1.zip");
        // 要上传到hdfs的目标路径
        Path dst = new Path("/baa.zip");
        fileSystem.copyFromLocalFile(src, dst);
        fileSystem.close();

    }

    /**
     * 删除文件夹
     * @throws IOException
     */
    @Test
    public void delete() throws IOException {
        // 删除文件夹 ，如果是非空文件夹，参数2必须给值true
        fileSystem.delete(new Path("/aaa"),true);//true表示递归删除

        fileSystem.rename(new Path("/haha"),new Path("/go.rar"));
        fileSystem.close();
    }

    /**
     * 输出所有配置信息
     * @throws IOException
     */
    @Test
    public void outPutConf() throws IOException {
        Iterator<Map.Entry<String, String>> iterator = configuration.iterator();
        while(iterator.hasNext()){
            Map.Entry<String, String> entry = iterator.next();
            System.out.println(entry.getKey()+" : "+entry.getValue());

        }
    }
    /**
     * 输出指定文件夹及其子文件夹所有文件
     *
     * @throws IOException
     */
    @Test
    public void outPutFiles() throws IOException {
        RemoteIterator<LocatedFileStatus> iterator = fileSystem.listFiles(new Path("/"), true);
        while (iterator.hasNext()) {
            System.out.println();
            LocatedFileStatus locatedFileStatus = iterator.next();
            System.out.println(locatedFileStatus.getGroup());
            System.out.println(locatedFileStatus.getBlockSize());
            System.out.println(locatedFileStatus.getPath());
            System.out.println(locatedFileStatus.getPermission());
            System.out.println("locations:");
            BlockLocation[] locations = locatedFileStatus.getBlockLocations();
            for (BlockLocation location : locations
                    ) {
                System.out.println("getNames:  " + location.getNames() + ",getLength:  " + location.getLength() + ",getOffset: " + location.getOffset());
                String[] hosts = location.getHosts();
                System.out.println(Arrays.toString(hosts));
            }
        }
    }

    /**
     * 输出hdfs指定目录下文件夹和文件
     *
     * @throws IOException
     */
     @Test
    public void outPutDir() throws IOException {
        FileStatus[] fileStatuses = fileSystem.listStatus(new Path("/aaa"));
        String s = "d---       ";
        for (FileStatus fileStatus : fileStatuses) {
            if (fileStatus.isFile())
                System.out.println("idfile");
            System.out.println(fileStatus.getPath().getName());
        }
    }
}
